package com.snail.billing;

import java.math.BigDecimal;

import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;

import com.android.os.MyEngine;
import com.android.util.AlertUtil;
import com.snail.billing.data.AccountManager;
import com.snail.billing.fragment.LaunchFragment;
import com.snail.billing.fragment.LoginFragment;
import com.snail.billing.fragment.RegisterFragment;
import com.snail.billing.fragment.StateImprestFragment;
import com.snail.billing.fragment.StateImprestFragment2;
import com.snail.billing.fragment.StatePaymentFragment;
import com.snail.billing.fragment.UserCenterFragment;

public class BillingService {

	/**
	 * 是否使用沙盒测试环境
	 * 
	 * @param isUseful
	 *            -- 是否使用沙盒测试环境
	 */
	public static void setSandBox(boolean isUseful) {
		DataCache.getInstance().isSandbox = isUseful;
	}

	private static void initContext(Context context) {
		MyEngine.getEngine().setApplicationContext(context.getApplicationContext());
		AccountManager.checkUUID();
		AccountManager.checkAccount();
	}

	private static void setHostParams(ImportParams importParams) {
		if (DataCache.getInstance().isSandbox) {
			// 沙盒sandbox
			importParams.hostPlatform = "www3.sandbox.wn";
			importParams.hostImprest = "payment.api.sandbox.wn";
			importParams.hostCard = "payment.api.sandbox.wn";
			importParams.hostBusiness = "business.api.sandbox.wn";
			importParams.hostSecurity = "security.woniu.com";
			importParams.isAccess = true;
		} else {
			// 正式
			importParams.hostPlatform = "www3.woniu.com";
			importParams.hostImprest = "imprest.api.woniu.com";
			importParams.hostCard = "card.api.woniu.com";
			importParams.hostBusiness = "passport.api.woniu.com";
			importParams.hostSecurity = "security.woniu.com";
			importParams.isAccess = true;
		}
	}

	/**
	 * 登录主界面
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param gameId
	 *            -- 游戏ID
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 * @param loginCallback
	 *            -- 登录回调接口
	 */
	public static void launch(Context context, String gameId, String extra, LoginCallback loginCallback) {
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.gameId = gameId;
		importParams.loginCallback = loginCallback;
		importParams.fragmentClass = LaunchFragment.class;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		//
		Intent intent = new Intent();
		intent.setClass(context, Billing.class);
		context.startActivity(intent);
	}

	/**
	 * 登录主界面
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param gameId
	 *            -- 游戏ID
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 * @param loginCallback
	 *            -- 登录回调接口
	 */
	public static void oneKeyLogin(Context context, String gameId, String extra, LoginCallback loginCallback) {
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.gameId = gameId;
		importParams.loginCallback = loginCallback;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		//
		BillingLogic logic = new BillingLogic(context);
		logic.oneKeyLogin(null);
	}

	/**
	 * 普通登录
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param gameId
	 *            -- 游戏ID
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 * @param loginCallback
	 *            -- 登录回调接口
	 */
	public static void commonLogin(Context context, String gameId, String extra, LoginCallback loginCallback) {
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.gameId = gameId;
		importParams.loginCallback = loginCallback;
		importParams.fragmentClass = LoginFragment.class;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		//
		Intent intent = new Intent();
		intent.setClass(context, Billing.class);
		context.startActivity(intent);
	}

	/**
	 * 普通登录成功后调用 （如果不使用SDK普通登录功能，但又要使用会员中心功能，请在游戏登录成功后也调用此方法）
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param account
	 *            -- 账号（蜗牛通行证）
	 * @param pwd
	 *            -- 密码
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 */
	public static void commonLoginSucceed(Context context, String account, String pwd, String extra) {
		initContext(context);
		AccountManager.saveAccount(account, pwd);
	}

	/**
	 * 快速注册
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param gameId
	 *            -- 游戏ID
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 * @param loginCallback
	 *            -- 登录回调接口
	 */
	public static void commonRegister(Context context, String gameId, String extra, LoginCallback loginCallback) {
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.gameId = gameId;
		importParams.loginCallback = loginCallback;
		importParams.fragmentClass = RegisterFragment.class;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		//
		Intent intent = new Intent();
		intent.setClass(context, Billing.class);
		context.startActivity(intent);
	}

	/**
	 * 进入用户中心
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param account
	 *            -- 账号
	 * @param gameId
	 *            -- 游戏ID
	 * @param serverId
	 *            -- 服务器ID
	 * @param userCenterTypes
	 *            -- 选择会员中心的功能类型并支持排序，传null则使用默认
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 * @param loginCallback
	 *            -- 登录回调接口
	 */
	public static void startUserCenter(Context context, String account, String gameId, String serverId, int[] userCenterTypes, String extra, LoginCallback loginCallback) {
		if (TextUtils.isEmpty(account)) {
			AlertUtil.show(context, "account param is null");
			return;
		}
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		if (TextUtils.isEmpty(serverId)) {
			AlertUtil.show(context, "serverId param is null");
			return;
		}
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.account = account;
		importParams.gameId = gameId;
		importParams.serverId = serverId;
		importParams.loginCallback = loginCallback;
		importParams.fragmentClass = UserCenterFragment.class;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		//
		if (userCenterTypes == null) {
			userCenterTypes = new int[] { 0, 1, 2, 3, 4, 5, 6 };
		}
		DataCache.getInstance().userCenterTypes = userCenterTypes;
		//
		Intent intent = new Intent();
		intent.setClass(context, Billing.class);
		context.startActivity(intent);
	}
	
	
	/**
	 * 显示用户中心浮动图标
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param account
	 *            -- 账号
	 * @param gameId
	 *            -- 游戏ID
	 * @param serverId
	 *            -- 服务器ID
	 * @param userCenterTypes
	 *            -- 选择会员中心的功能类型并支持排序，传null则使用默认
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 * @param loginCallback
	 *            -- 登录回调接口
	 */
	public static void showUserCenterFloatView(Context context, String account, String gameId, String serverId, int[] userCenterTypes, String extra, LoginCallback loginCallback) {
		if (TextUtils.isEmpty(account)) {
			AlertUtil.show(context, "account param is null");
			return;
		}
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		if (TextUtils.isEmpty(serverId)) {
			AlertUtil.show(context, "serverId param is null");
			return;
		}
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.account = account;
		importParams.gameId = gameId;
		importParams.serverId = serverId;
		importParams.loginCallback = loginCallback;
		importParams.fragmentClass = UserCenterFragment.class;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		//
		if (userCenterTypes == null) {
			userCenterTypes = new int[] { 0, 1, 2, 3, 4, 5, 6 };
		}
		DataCache.getInstance().userCenterTypes = userCenterTypes;
		//
		BillingLogic logic = new BillingLogic(context);
		logic.showUserCenterFloatView();
	}
	
	public static void dismissUserCenterFloatView(Context context) {
		BillingLogic logic = new BillingLogic(context);
		logic.dismissUserCenterFloatView();
	}

	/**
	 * 创建订单
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param partnerId
	 *            -- 运营商ID（蜗牛官方为"007"，第三方平台都是三位数字,不足3位，前面补0）
	 * @param gameId
	 *            -- 游戏ID
	 * @param serverId
	 *            -- 服务器ID
	 * @param accountId
	 *            -- 账号数字ID
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 * @param paymentOrderCallback
	 *            -- 订单回调
	 */
	public static void createOrderNo(Context context, String partnerId, String gameId, String serverId, String accountId, String extra, PaymentOrderCallback paymentOrderCallback) {
		if (TextUtils.isEmpty(partnerId)) {
			AlertUtil.show(context, "partnerId param is null");
			return;
		}
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		if (TextUtils.isEmpty(serverId)) {
			AlertUtil.show(context, "serverId param is null");
			return;
		}
		if (TextUtils.isEmpty(accountId)) {
			AlertUtil.show(context, "accountId param is null");
			return;
		}
		while (partnerId.length() < 3) {
			partnerId = "0" + partnerId;
		}
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.gameId = gameId;
		importParams.serverId = serverId;
		importParams.partnerId = partnerId;
		importParams.aid = accountId;
		importParams.paymentOrderCallback = paymentOrderCallback;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		//
		BillingLogic logic = new BillingLogic(context);
		logic.createOrderNo();
	}

	/**
	 * 游戏充值
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param account
	 *            -- 账号（蜗牛通行证账号）
	 * @param gameId
	 *            -- 游戏ID
	 * @param imprestDestination
	 *            -- "1"充值到中心，"2"充值到分区
	 * @param serverId
	 *            -- 服务器ID
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 */
	public static void imprestForGame(Context context, String account, String gameId, String imprestDestination, String serverId, String extra) {
		if (TextUtils.isEmpty(account)) {
			AlertUtil.show(context, "account param is null");
			return;
		}
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		if (TextUtils.isEmpty(imprestDestination)) {
			AlertUtil.show(context, "imprestDestination param is null");
			return;
		}
		if (!"1".equals(imprestDestination) && !"2".equals(imprestDestination)) {
			AlertUtil.show(context, "imprestDestination param is error");
			return;
		}
		if (TextUtils.isEmpty(serverId)) {
			AlertUtil.show(context, "serverId param is null");
			return;
		}
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.account = account;
		importParams.gameId = gameId;
		importParams.imprestDestination = imprestDestination;
		importParams.serverId = serverId;
		importParams.fragmentClass = StateImprestFragment.class;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		//
		Intent intent = new Intent();
		intent.setClass(context, Billing.class);
		context.startActivity(intent);
	}

	/**
	 * 游戏支付
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param orderNo
	 *            -- 游戏订单号,(根据以下接口回调获取{@link BillingService#createGameOrderNo(Context, String, String, String, String, PaymentOrderCallback)})
	 * @param account
	 *            -- 账号（蜗牛通行证账号）
	 * @param gameId
	 *            -- 游戏ID
	 * @param produceName
	 *            -- 商品名称
	 * @param price
	 *            -- 价格（单位：元）
	 * @param backUrl
	 *            -- 异步通知地址
	 * @param fontUrl
	 *            -- 前台页面跳转
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 */
	public static void paymentForGame(Context context, String orderNo, String account, String gameId, String produceName, String price, String backUrl, String fontUrl, String extra) {
		if (TextUtils.isEmpty(orderNo)) {
			AlertUtil.show(context, "orderNo param is null");
			return;
		}
		if (TextUtils.isEmpty(account)) {
			AlertUtil.show(context, "account param is null");
			return;
		}
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		if (TextUtils.isEmpty(produceName)) {
			AlertUtil.show(context, "produceName param is null");
			return;
		}
		if (TextUtils.isEmpty(price)) {
			AlertUtil.show(context, "price param is null");
			return;
		}
		try {
			new BigDecimal(price);
		} catch (Exception e) {
			AlertUtil.show(context, "price param is error");
			return;
		}
		if (new BigDecimal(price).equals(new BigDecimal(0))) {
			AlertUtil.show(context, "price param is error");
			return;
		}
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.account = account;
		importParams.gameId = gameId;
		importParams.orderNo = orderNo;
		importParams.produceName = produceName;
		importParams.price = price;
		importParams.backUrl = backUrl;
		importParams.fontUrl = fontUrl;
		importParams.extra = extra;
		importParams.fragmentClass = StatePaymentFragment.class;
		//
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		//
		Intent intent = new Intent();
		intent.setClass(context, Billing.class);
		context.startActivity(intent);
	}

	/**
	 * 游戏充值(直充)
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param account
	 *            -- 账号（蜗牛通行证账号）
	 * @param gameId
	 *            -- 游戏ID
	 * @param price
	 *            -- 价格（单位：元）
	 * @param serverId
	 *            -- 服务器ID
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 */
	public static void imprestForGame2(Context context, String account, String gameId, String price, String extra) {
		if (TextUtils.isEmpty(account)) {
			AlertUtil.show(context, "account param is null");
			return;
		}
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		if (TextUtils.isEmpty(price)) {
			AlertUtil.show(context, "price param is null");
			return;
		}
		try {
			new BigDecimal(price);
		} catch (Exception e) {
			AlertUtil.show(context, "price param is error");
			return;
		}
		if (new BigDecimal(price).equals(new BigDecimal(0))) {
			AlertUtil.show(context, "price param is error");
			return;
		}
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.account = account;
		importParams.gameId = gameId;
		importParams.imprestDestination = "1";
		importParams.price = price;
		importParams.fragmentClass = StateImprestFragment2.class;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		//
		Intent intent = new Intent();
		intent.setClass(context, Billing.class);
		context.startActivity(intent);
	}

	/**
	 * 一键注册
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param gameId
	 *            -- 游戏ID
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 * @param loginCallback
	 *            -- 登录回调接口
	 */
	public static void oneKeyRegister(Context context, String gameId, String extra, LoginCallback loginCallback) {
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.gameId = gameId;
		importParams.loginCallback = loginCallback;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		//
		BillingLogic logic = new BillingLogic(context);
		logic.oneKeyRegister();
	}

}
